package com.tedu.API.io;

import org.junit.Test;

import java.io.*;

/**
 * IO流--传对象--高级流
 * ObjectOutStream  对象输出流--传Person.java对象--写操作
 * ObjectInputStream  对象输入流--传Person.java对象---读操作
 */
public class ObjectIO {
    /**
     *  ObjectOutStream  对象输出流
     *  使用方式: 1.创建实现序列化接口的对象
     *          2. 对象输出流---xxx.obj文件
     *                        传输对象，指定格式为obj
     */

    @Test
    public void testOOS() {
        //1.创建Person对象
        Person p=new Person();  //代表Person.java里的空参构造器
        p.setName("乃瑜");
        //数组---动态数组
        //  String[] str={"1","2","3"};  静态数组
        // String[] str=new String[]{"1"};  动态数组
        p.setSay(new String[]{"我不是妖，也不是仙，我是你乃瑜爷爷~~"}); //动态数组传输方式
        System.out.println("打印对象: "+p.toString());  //toString() 默认调用

        //使用对象输出流写出一个文件  xxx.obj  Person.java
        FileOutputStream fos= null; //对流
        try {
            fos = new FileOutputStream("person.obj");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        ObjectOutputStream oos= null;
        try {
            oos = new ObjectOutputStream(fos);
        } catch (IOException e) {
            e.printStackTrace();
        }
        /**
         * writeObject(Object obj)   ----理解: 写出对象
         * 官方解释: 该方法会将给定的对象按照其结构进行转换，
         *          转换为一组"组"字节，然后通过其处理的流写出
         *
         *  NotSerializableException  没有序列化异常
         *  原因: 写出类没有实现序列化接口
         *
         * 写出文件的专业术语:
         *  1.通过对象输出流将Person类，先转换为一组"组"字节，
         *     这个过程叫做【对象序列化】
         *  2.将序列化后的字节在通过字节流【硬盘上】做长久保存，
         *    这个过程叫做【数据持久化】
         *    将person.obj持久化保存到硬盘上
          */
        if (oos != null) {
            try {
                oos.writeObject(p);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        System.out.println("写出成功~~");  //打桩
    }

    /**
     * ObjectInputStream  对象输入流
     * 序列化: 将对象转换为二进制
     * 反序列化: 将二进制转换为对象
     * readObject() 返回读取对象【?】
     *
     * 需求: 将序列化person.obj文件  按照对象的方式进行读入
     */
    @Test
    public void testO0IS() {
        //1.创建低级流
        FileInputStream fis= null;
        try {
            fis = new FileInputStream("person.obj");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        //2.创建高级流---对象读入
        ObjectInputStream ois= null;
        try {
            ois = new ObjectInputStream(fis);
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //readObject()  获取对象【反序列化操作: 二进制转换为对象】
            if (ois != null) {
                try {
                    System.out.println(ois.readObject());
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
            }
        }
        System.out.println("反序列化成功~~~");
    }
}
